 ORG $4000
 LST OFF
*
* APPLESOFT BASIC RENUMBER   *
* REVISED FOR PRODOS 3/03/89 *
*
LENGTH EQU $2F
PCL EQU $3A
PCH EQU $3B
A1L EQU $3C
A1H EQU $3D
A2L EQU $3E
A2H EQU $3F
A4L EQU $42
A4H EQU $43
A5L EQU $44
A5H EQU $45
TXTTAB EQU $67 START OF PROGRAM
VARTAB EQU $69 START OF VARIABLES
HIMEM EQU $73
IMMFLG EQU $76
ENDL EQU $9D
ENDH EQU $9E
STARTL EQU $9F
STARTH EQU $A0
INCL EQU $A1
INCH EQU $A2
FIRSTL EQU $A3
FIRSTH EQU $A4
LA5 EQU $A5
LA6 EQU $A6
LA7 EQU $A7
LA8 EQU $A8
LA9 EQU $A9
LAA EQU $AA
LAB EQU $AB
PRGEND EQU $AF
TXTPTR EQU $B8
KEYBUF EQU $0200
AMPERV EQU $03F5
DOSWARM EQU $BE00
DOSERR EQU $BE09
FREBUFR EQU $BEF8
BIHIMEM EQU $BEFB
GETBUFR EQU $BEF5
CLEAR EQU $D66C
INSDS EQU $F88C
PRBLNK EQU $F948
RDKEY EQU $FD0C
COUT EQU $FDED
MOVE EQU $FE2C
PRERR EQU $FF2D
*
*
*
 LDA AMPERV+1 DETECT PRESENCE OF
 STA A1L RENUMBER BY COMPARING
 LDA AMPERV+2 FIRST 2 BYTES OF ACTUAL
 STA A1H ROUTINE.
 LDY #0
 LDA (A1L),Y
 CMP RENUMBER
 BNE GETROOM RENUMBER NOT PRESENT
 INY
 LDA (A1L),Y
 CMP RENUMBER+1
 BEQ READY RENUMBER ALREADY INSTALLED
GETROOM LDA #7 SEE IF ROOM FOR RENUMBER
 JSR GETBUFR
 BCC MOVER
 LDA #$0C NO BUFFERS AVAILABLE
 JMP DOSERR
MOVER PHA  INSTALL RENUMBER
 SEC  ALLOW GP BUFFER FOR BI
 SBC #4 PROTECT RENUMBER
 STA BIHIMEM ABOVE FREBUFR CALL
 JSR FREBUFR
 PLA
 STA A4H
 STA PCH
 STA AMPERV+2
 LDA #0
 STA AMPERV+1
 STA A4L
 STA PCL
 STA A1L
 LDA #<RENUMBER
 STA A1H
 STA A5L
 CLC
 ADC #6
 STA A2H
 LDA #$FE
 STA A2L
 LDA A1H
 SEC
 SBC A4H
 STA A5H
 JSR MOVE
 INC A2H
RELOC LDX #0
 JSR INSDS
 LDY LENGTH
 CPY #2
 BCC NABS
 LDA (PCL),Y
 CMP A2H
 BCS NABS
 CMP A5L
 BCC NABS
 SBC A5H
 STA (PCL),Y
NABS TYA
 BNE PCADJL
 LDA (PCL),Y BRK INSTRUCTION
 BEQ READY MARKS END OF MAIN
PCADJL SEC
 LDA LENGTH
 LDY PCH
 TAX
 BPL PCADJ
 DEY
PCADJ ADC PCL
 BCC PCADJ2
 INY
PCADJ2 STA PCL
 STY PCH
 BNE RELOC ALWAYS TAKEN
READY LDY #RDYMSG-ERRMSG
 JMP NOERROR RTS TO BASIC
ENDLOAD EQU >*
 DS $100-ENDLOAD,0
*
*** RENUMBER MAIN ***
*
RENUMBER LDY #WRKMSG-ERRMSG
 JSR ERROUT
 LDY TXTPTR
 STY CHARGOT+1
 LDY TXTPTR+1
 STY CHARGOT+2
 JSR CHARGOT
 LDY #$01
 LDA (TXTTAB),Y
 BNE RENUM2
 DEY 
 JMP ERROR NO PROGRAM
RENUM2 LDA #$FF SET DEFAULT VALUES
 STA IMMFLG SET IMMED MODE UPON EXIT
 LDX #10
 LDY #$00
 STA ENDL END = 65535
 STA ENDH
 STY STARTL START = 0
 STY STARTH
 STX INCL INCREMENT = 10
 STY INCH
 STX FIRSTL FIRST = 10
 STY FIRSTH
 JSR CHARGOT
 BCC SYNERR LEADING DIGIT
 BEQ ENDPARSE EOS (USE DEFAULT VALUES)
 BNE PARSE
CHKCOM JSR CHARGOT
 CMP #$2C
 BNE SYNERR
 JSR CHARGET
PARSE LDX #$03 HANDLE E,S,I,F
PARS1 CMP L86C9,X 'ESIF'
 BEQ PARS2
 DEX 
 BPL PARS1
 INX 
 CMP #$80
 BEQ PARS2
SYNERR LDY #SYNMSG-ERRMSG
 JMP ERROR SYNTAX
PARS2 TXA 
 ASL A
 TAY 
PARS3 JSR CHARGET
 BEQ EOS
 BCC DIGIT
 CMP #$2C
 BNE PARS3
EOS LDX #$00
 STX LA8
 BEQ PARS4
DIGIT JSR L85D2
 LDX LA7
PARS4 STX ENDL,Y
 LDX LA8
 STX ENDH,Y
 CPX #$FA
 BCC PARS5
 LDY #NUMMSG-ERRMSG
 JMP ERROR LINE# TO LARGE
PARS5 TAX 
 BNE CHKCOM
ENDPARSE LDA INCL
 ORA INCH
 BNE DORENUMB
 LDY #INNMSG-ERRMSG
 JMP ERROR INCREMENT = 0
DORENUMB LDX #$03
L809F LDA TXTTAB,X
 STA LA5,X
 DEX 
 BPL L809F
 STX LAB
L80A8 LDY #$02
 LDA (LA5),Y
 INY 
 CMP STARTL
 LDA (LA5),Y
 INY 
 SBC STARTH
 BCS L80FD
 JSR L8617
 BNE L80A8
 LDY #RNGMSG-ERRMSG
 JMP ERROR RANGE ERROR
L80C0 LDX #$00
 STX LAB
 LDY #$02
L80C6 LDA (LA5),Y
 STA (LA7,X)
 INY 
 JSR L8626
 CPY #$03
 BEQ L80C6
 LDA FIRSTL
 STA (LA7,X)
 JSR L8626
 LDA FIRSTH
 STA (LA7,X)
 JSR L8626
 JSR L8617
 BEQ L8113
 CLC 
 LDA FIRSTL
 ADC INCL
 STA FIRSTL
 LDA FIRSTH
 ADC INCH
 STA FIRSTH
 BCS L80F8
 CMP #$FA
 BCC L80FD
L80F8 LDY #INCMSG-ERRMSG
 JMP ERROR INC TOO LARGE
L80FD LDA ENDL
 LDY #$02
 CMP (LA5),Y
 INY 
 LDA ENDH
 SBC (LA5),Y
 BCS L80C0
 LDA LAB
 BPL L8113
 LDY #RNGMSG-ERRMSG
 JMP ERROR RANGE ERROR
L8113 LDX #$00
 LDA #$FF
 STA (LA7,X)
 JSR L8626
 LDA #$FF
 STA (LA7,X)
 JSR L8626
 LDA TXTTAB
 STA LA5
 LDA TXTTAB+1
 STA LA6
L812B LDY #$02
 STY LAB
 LDA (LA5),Y
 STA ENDL
 INY 
 LDA (LA5),Y
 STA ENDH
 JSR L8679
 BCS L814B
 LDY #$00
 STY LAB
 JSR L8679
 BCC L814B
 LDY #DUPMSG-ERRMSG
 JMP ERROR DUPLICATE LINE#
L814B JSR L8617
 BNE L812B
 LDA LA7
 STA LA5
 LDA LA8
 STA LA6
 LDA TXTTAB
 STA CHARGOT+1
 LDA TXTTAB+1
 STA CHARGOT+2
 LDA VARTAB
 STA FIRSTL
 LDA VARTAB+1
 STA FIRSTH
 BNE L8178
L816C CPY #$EF
 BCC L8175
L8170 LDY #LINMSG-ERRMSG
 JMP ERROR LINE TOO LONG
L8175 JSR CHARGET
L8178 JSR CHARGET
 TAY 
 BNE L8181
 JMP L8219
L8181 JSR CHARGET
 JSR CHARGET
 LDY #$04
L8189 JSR CHARGET
L818C INY 
 BEQ L8170
 TAX 
 BEQ L816C
 BPL L8189
 LDX #$06
L8196 CMP L86CD,X
 BEQ L81A0
 DEX 
 BPL L8196
 BMI L8189
L81A0 JSR CHARGET
 BCS L818C
 JSR L85D2
 LDA LA7
 STA ENDL
 LDA LA8
 STA ENDH
 JSR L863E
 LDX #$00
 STX LA9
 STX LAA
 STX LAB
 LDX #$0F
L81BD ASL ENDL
 ROL ENDH
 SED 
 LDA LA9
 ADC LA9
 STA LA9
 LDA LAA
 ADC LAA
 STA LAA
 LDA LAB
 ADC LAB
 STA LAB
 CLD 
 DEX 
 BPL L81BD
 INX 
 STX ENDL
 LDX #$02
L81DD LDA #$01
 STA ENDH
 LDA LA9,X
 LSR A
 LSR A
 LSR A
 LSR A
L81E7 AND #$0F
 CMP ENDL
 BEQ L81F5
 DEC ENDL
 INY 
 BNE L81F5
L81F2 JMP L8170
L81F5 LDA LA9,X
 DEC ENDH
 BEQ L81E7
 DEX 
 BPL L81DD
 LDA ENDL
 BNE L8205
 INY 
 BEQ L81F2
L8205 JSR CHARGOT
 CMP #$C9
 BEQ L8213
 CMP #$2C
 BEQ L8213
 JMP L818C
L8213 INY 
 BEQ L81F2
 JMP L81A0
L8219 LDX #$FF
 CLC 
L821C LDA HIMEM+1,X
 STA ENDH,X
 SBC LA6,X
 STA INCH,X
 INX 
 BEQ L821C
 BCS L822E
 LDY #MEMMSG-ERRMSG
 JMP ERROR OUT OF MEMORY
L822E SBC #$02
 BCS L8241
 LDY #LMTMSG-ERRMSG
 JSR ERROUT LIMITED MEMORY
 JSR RDKEY
 CMP #$D9
 BEQ L8241
 JMP EXIT
L8241 LDA LA5
 STA STARTL
 LDA LA6
 STA STARTH
 LDY #$00
L824B DEC ENDH
 DEC STARTH
L824F DEY 
 LDA (STARTL),Y
 STA (ENDL),Y
 TYA 
 CLC 
 ADC STARTL
 EOR TXTTAB
 BNE L8264
 LDA STARTH
 ADC #$00
 EOR TXTTAB+1
 BEQ L8269
L8264 TYA 
 BNE L824F
 BEQ L824B
L8269 SEC 
 LDA VARTAB
 ADC INCL
 STA FIRSTL
 LDA VARTAB+1
 ADC INCH
 STA FIRSTH
 LDA TXTTAB
 STA LA5
 ADC INCL
 STA CHARGOT+1
 LDA TXTTAB+1
 STA LA6
 ADC INCH
 STA CHARGOT+2
 BCC L829E
L828A CLC 
 TYA 
 LDY #$00
 ADC LA5
 STA (LA5),Y
 INY 
 TAX 
 LDA LA6
 ADC #$00
 STA (LA5),Y
 STX LA5
 STA LA6
L829E JSR CHARGET
 JSR CHARGET
 TAY 
 BNE L82AA
 JMP L8354
L82AA JSR CHARGET
 STA ENDL
 JSR CHARGET
 STA ENDH
 JSR L863E
 LDY #$02
 LDA ENDL
 STA (LA5),Y
 INY 
 LDA ENDH
 STA (LA5),Y
 INY 
L82C3 JSR CHARGET
L82C6 STA (LA5),Y
 INY 
 TAX 
 BEQ L828A
 BPL L82C3
 LDX #$06
L82D0 CMP L86CD,X
 BEQ L82DA
 DEX 
 BPL L82D0
 BMI L82C3
L82DA JSR CHARGET
 BCS L82C6
 JSR L85D2
 LDA LA7
 STA ENDL
 LDA LA8
 STA ENDH
 JSR L863E
 LDX #$00
 STX LA9
 STX LAA
 STX LAB
 LDX #$0F
L82F7 ASL ENDL
 ROL ENDH
 SED 
 LDA LA9
 ADC LA9
 STA LA9
 LDA LAA
 ADC LAA
 STA LAA
 LDA LAB
 ADC LAB
 STA LAB
 CLD 
 DEX 
 BPL L82F7
 INX 
 STX ENDL
 LDX #$02
L8317 LDA #$01
 STA ENDH
 LDA LA9,X
 LSR A
 LSR A
 LSR A
 LSR A
L8321 AND #$0F
 CMP ENDL
 BEQ L832E
 DEC ENDL
 ORA #$30
 STA (LA5),Y
 INY 
L832E LDA LA9,X
 DEC ENDH
 BEQ L8321
 DEX 
 BPL L8317
 LDA ENDL
 BNE L8340
 LDA #$30
 STA (LA5),Y
 INY 
L8340 JSR CHARGOT
 CMP #$C9
 BEQ L834E
 CMP #$2C
 BEQ L834E
 JMP L82C6
L834E STA (LA5),Y
 INY 
 JMP L82DA
L8354 CLC 
 LDA LA5
 ADC #$02
 STA VARTAB
 STA PRGEND
 LDA LA6
 ADC #$00
 STA VARTAB+1
 STA PRGEND+1
 LDA #$00
 LDY #$07
L8369 STA (LA5),Y
 DEY 
 BPL L8369
 SEC 
 LDA HIMEM
 SBC #$06
 STA ENDL
 TAY 
 LDA HIMEM+1
 SBC #$00
 STA ENDH
 CPY VARTAB
 SBC VARTAB+1
 SBC #$01
 BCS L8389
 LDY #MEMMSG-ERRMSG
 JMP ERROR OUT OF MEMORY
L8389 LDY #$05
 LDA #$00
L838D STA (ENDL),Y
 DEY 
 BPL L838D
L8392 LDA TXTTAB
 STA STARTL
 STA LA5
 LDA TXTTAB+1
 STA STARTH
 STA LA6
 LDY #$00
 STY INCL
 STY INCH
 INY 
 JSR L8623
 BNE L83AD
 JMP EXIT
L83AD LDY #$02
 LDA INCL
 CMP (LA5),Y
 INY 
 LDA INCH
 SBC (LA5),Y
 BCS L83CB
 LDA (LA5),Y
 STA INCH
 DEY 
 LDA (LA5),Y
 STA INCL
 LDA LA5
 STA STARTL
 LDA LA6
 STA STARTH
L83CB JSR L8617
 BNE L83AD
 LDY #$00
 SEC 
 LDA (STARTL),Y
 STA LA5
 SBC STARTL
 STA FIRSTL
 INY 
 LDA (STARTL),Y
 STA LA6
 SBC STARTH
 STA FIRSTH
 LDA ENDL
 STA LA7
 SBC FIRSTL
 STA ENDL
 LDA ENDH
 STA LA8
 SBC FIRSTH
 STA ENDH
 LDY FIRSTL
 DEY 
L83F7 LDA (STARTL),Y
 STA (ENDL),Y
 DEY 
 BNE L83F7
 LDA (STARTL),Y
 STA (ENDL),Y
L8402 LDA LA5
 STA LA7
 LDA LA6
 STA LA8
 JSR L8617
 LDY #$00
L840F LDA (LA7),Y
 STA (STARTL),Y
 INY 
 TAX 
 BNE L840F
 CPY #$05
 BCC L840F
 LDA LA5
 ORA LA6
 BEQ L8437
 CLC 
 TYA 
 LDY #$00
 ADC STARTL
 STA (STARTL),Y
 TAX 
 INY 
 LDA #$00
 ADC STARTH
 STA (STARTL),Y
 STX STARTL
 STA STARTH
 BNE L8402
L8437 LDY #$01
 LDA (TXTTAB),Y
 BEQ L8440
 JMP L8392
L8440 LDA TXTTAB
 STA LA5
 LDA TXTTAB+1
 STA LA6
 SEC 
 LDA ENDL
 SBC #$01
 STA CHARGOT+1
 LDA ENDH
 SBC #$00
 STA CHARGOT+2
L8457 LDY #$00
L8459 JSR CHARGET
 STA (LA5),Y
 INY 
 TAX 
 BNE L8459
 CPY #$05
 BCC L8459
 STY LAB
 LDY #$01
 JSR L8623
 BEQ EXIT
 CLC 
 LDY #$00
 LDA LAB
 ADC LA5
 STA (LA5),Y
 TAX 
 INY 
 LDA #$00
 ADC LA6
 STA (LA5),Y
 STX LA5
 STA LA6
 BNE L8457
EXIT LDY #DONMSG-ERRMSG
 BNE NOERROR
ERROR JSR PRERR
 JSR PRBLNK
NOERROR JSR ERROUT
 LDX #$0E
 LDA #$00
L848E STA ENDL,X
 STA KEYBUF,X
 DEX 
 BPL L848E
 LDX IMMFLG
 INX
 BEQ IMMED
 RTS  RTS TO RUNNING PROGRAM
IMMED STA TXTPTR HANDLE IMMEDIATE RETURN
 LDX #$02
 STX TXTPTR+1
 JSR CLEAR
 JMP DOSWARM
L85D2 LDX #$00
 STX LA7
 STX LA8
L85D8 TAX 
 ASL LA7
 ROL LA8
 BCS L8610
 LDA LA8
 STA LAB
 LDA LA7
 ASL A
 ROL LAB
 BCS L8610
 ASL A
 ROL LAB
 BCS L8610
 ADC LA7
 STA LA7
 LDA LAB
 ADC LA8
 STA LA8
 BCS L8610
 TXA 
 AND #$0F
 ADC LA7
 STA LA7
 LDA LA8
 ADC #$00
 STA LA8
 BCS L8610
 JSR CHARGET
 BCC L85D8
 RTS 
L8610 PLA 
 PLA 
 LDY #NUMMSG-ERRMSG
 JMP ERROR LINE# > 63999
L8617 LDY #$00
 LDA (LA5),Y
 INY 
 TAX 
 LDA (LA5),Y
 STX LA5
 STA LA6
L8623 LDA (LA5),Y
 RTS 
L8626 INC LA7
 BNE L862C
 INC LA8
L862C LDA LA7
 CMP HIMEM
 LDA LA8
 SBC HIMEM+1
 BCC L863D
 PLA 
 PLA 
 LDY #MEMMSG-ERRMSG
 JMP ERROR OUT OF MEMORY
L863D RTS 
L863E STY LAB
 LDA FIRSTL
 STA LA7
 LDA FIRSTH
 STA LA8
L8648 LDY #$00
 LDA (LA7),Y
 EOR ENDL
 BNE L8657
 INY 
 LDA (LA7),Y
 EOR ENDH
 BEQ L866C
L8657 CLC 
 LDA LA7
 ADC #$04
 STA LA7
 BCC L8662
 INC LA8
L8662 LDY #$01
 LDA (LA7),Y
 CMP #$FF
 BNE L8648
 BEQ L8676
L866C INY 
 LDA (LA7),Y
 STA ENDL
 INY 
 LDA (LA7),Y
 STA ENDH
L8676 LDY LAB
 RTS 
L8679 LDA VARTAB
 STA FIRSTL
 LDA VARTAB+1
 STA FIRSTH
L8681 LDY LAB
 CLC 
 LDA (FIRSTL),Y
 EOR ENDL
 BNE L8691
 INY 
 LDA (FIRSTL),Y
 EOR ENDH
 BEQ L86A3
L8691 LDA FIRSTL
 ADC #$04
 STA FIRSTL
 BCC L869B
 INC FIRSTH
L869B LDY #$01
 LDA (FIRSTL),Y
 CMP #$FF
 BNE L8681
L86A3 RTS 
ERROUT LDA ERRMSG,Y
 PHA 
 INY 
 ORA #$80
 JSR COUT
 PLA 
 BPL ERROUT
 RTS 
CHARGET INC CHARGOT+1
 BNE CHARGOT
 INC CHARGOT+2
CHARGOT LDA KEYBUF
 CMP #$3A
 BCS L86C7
 SEC 
 SBC #$30
 SEC 
 SBC #$D0
L86C7 RTS 
 BRK  MARKS END OF MAIN
L86C9 ASC 'ESIF'
L86CD DFB $85
 MSB ON
 ASC ',+0<D'
 MSB OFF
*
* MESSAGE TABLE MUST BE < 256 BYTES !!
* PRESENTLY 3 BYTES TO SPARE !
*
ERRMSG ASC 'NO PROGRAM IN MEMORY'
 DFB $8D
RNGMSG ASC 'NO LINES IN RANGE'
 DFB $8D
INCMSG ASC 'INCREMENT TOO LARGE'
 DFB $8D
DUPMSG ASC 'DUPLICATE LINE NUMBERS'
 DFB $8D
MEMMSG ASC 'OUT OF MEMORY'
 DFB $8D
LMTMSG ASC 'LIMITED MEMORY, MAY DESTROY PROGRAM'
 ASC '     CONTINUE (Y/N)?'
 DFB $07,$8D
SYNMSG ASC 'SYNTAX'
 DFB $8D
NUMMSG ASC '> 63999'
 DFB $8D
LINMSG ASC 'LINE TOO LONG'
 DFB $8D
INNMSG ASC 'INCREMENT = 0'
 DFB $8D
RDYMSG ASC 'RENUMBER INSTALLED'
 DFB $8D
WRKMSG ASC 'RENUMBER WORKING...'
 DFB $8D
DONMSG ASC 'DONE => NO ERRORS'
 DFB $8D
